package models; import java.util.concurrent.atomic.AtomicInteger; import Controller.Controller; import parameters.Parameters; import views.SimulatorFrame; public class Simulator implements Runnable { private AtomicInteger clientNo=new AtomicInteger(); private Scheduler scheduler; private SimulatorFrame frame; private int[] averageWaitingTime=new int[10]; private int[] averageServiceTime=new int[10]; private int[] peakHour=new int[10]; private int[] clientsPerServer=new int[10]; public Simulator() { scheduler = new Scheduler(); frame = new SimulatorFrame(); } @Override public void run() { int peak=0; int currTime = 0; while (currTime <Parameters.finishTime) { int serviceTime = (int) (Math.random() * (Parameters.maxServiceTime - Parameters.minServiceTime) + Parameters.minServiceTime); int arrivalInterval=(int) (Math.random() * (Parameters.maxArrivalInterval - Parameters.minArrivalInterval) + Parameters.minArrivalInterval); currTime=currTime+arrivalInterval; Task t = new Task(currTime, serviceTime); clientNo.set(clientNo.get()+1); t.setClientNo(clientNo.get()); scheduler.dispatchTaskOnServer(t); t.toString(); frame.displayData(scheduler.getCurrentTasks()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } if (currTime>=Parameters.finishTime){ int i=0; for (Task[] t:scheduler.getAllTasks()){ averageWaitingTime[i]=0; averageServiceTime[i]=0; clientsPerServer[i]=0; System.out.println("Logger of server no"+i); for (Task task:t){ System.out.println(task.toString()); clientFrequency(task); int aux=task.getFinishTime()-task.getArrivalTime(); averageWaitingTime[i]+=aux; averageServiceTime[i]+=task.getServiceTime(); clientsPerServer[i]++; } averageWaitingTime[i]=averageWaitingTime[i]/clientsPerServer[i]; averageServiceTime[i]=averageServiceTime[i]/clientsPerServer[i]; System.out.println("Average waiting time: "+Integer.toString(averageWaitingTime[i])); System.out.println("Average service time: "+Integer.toString(averageServiceTime[i])); System.out.println("No clients per server: "+Integer.toString(clientsPerServer[i])); i++; } System.out.println("Peak hour: "+Integer.toString(peak(peakHour))); peak=peak(peakHour); } while (scheduler.isEmpty()==false){ frame.displayData(scheduler.getCurrentTasks()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } frame.displayStatistics(averageWaitingTime,averageServiceTime,peak); } public int peak(int[] peakHour){ int max=Integer.MIN_VALUE; for (int i=0;i<peakHour.length;i++){ if (peakHour[i]>max) max=i; } return max; } public void clientFrequency(Task t){ int hours=3; for (int i=1;i<hours;i++){ if ((i*60>t.getArrivalTime())&&(t.getArrivalTime()>(i-1)*60)){ peakHour[i]+=1; } } } public SimulatorFrame getSimulatorFrame(){ return frame; } public static void main(String[] args){ new Controller(); } }